#pragma once
#include <vector>
#include <string>
#include <array>
#ifdef DLL_SAMPLE_EXPORTS
#define DLL_API __declspec(dllexport)
#else
#define DLL_API __declspec(dllimport)
#endif
using namespace std;
class Figure
{
    public:
		virtual ~Figure() {};
    virtual string figure() = 0;
    virtual vector<double> get_list_coordinates() = 0;
    virtual void move(double& tmp_x, double& tmp_y) = 0;
    virtual void set(vector<double> points_x, vector<double> points_y) = 0;
};

class DLL_API Make_Figure
{
    std::vector<Figure*> any_figure;
    public:
    ~Make_Figure();
    void   push_back(Figure* figure);
    void  pop_back(double* number);
    void   move_figure(double& find_figure, double& x, double& y);
    void   writeFile(string name);
    void  load_file(string& name);
    std::vector<Figure*>& getFigures()
    {
        return any_figure;
    };
};
class DLL_API triangle : public Figure
{
    std::array<double, 3> x;
    std::array<double, 3> y;
    public:
    ~triangle();
    void move(double& tmp_x, double& tmp_y);
    void set(vector<double> points_x, vector<double> points_y);
    triangle(vector<double>& set_x, vector<double>& set_y);
    string figure();
    vector<double> get_list_coordinates();
};

class DLL_API circle :public Figure
{
	vector<double> data_x;
	vector<double> data_y;
    public:
    ~circle();
    circle(vector<double> points_x, vector<double> points_y);
    void set(vector<double> points_x, vector<double> points_y);
    void move(double& tmp_x, double& tmp_y);
    vector<double> get_list_coordinates();
    string figure();
};
class DLL_API rectangle :public Figure
{
	std::array<double, 4> x ;
	std::array<double, 4> y;
    public:
    ~rectangle();
    void move(double & tmp_x, double & tmp_y);
    void set(vector<double> points_x, vector<double> points_y);
    rectangle(vector<double>& set_x, vector <double>& set_y);
    vector<double> get_list_coordinates();
    string figure();
};